package com.example.airobotpositions.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.airobotpositions.dao.AddPositionsDto;
import com.example.airobotpositions.dao.PositionPageResultDto;
import com.example.airobotpositions.dao.PositionQueryDto;
import com.example.airobotpositions.dao.PositionResultDto;
import com.example.airobotpositions.dao.UpdatePositionDto;
import com.example.airobotpositions.entity.InterviewPositions;
import com.example.airobotpositions.mapper.InterviewPositionsMapper;
import com.example.airobotpositions.service.IInterviewPositionsService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;


/**
 * <p>
 * 面试职位信息表 服务实现类
 * </p>
 *
 * @author 沈骜嘉
 * @since 2025-04-15
 */
@Service
public class InterviewPositionsServiceImpl extends ServiceImpl<InterviewPositionsMapper, InterviewPositions> implements IInterviewPositionsService {


    @Autowired
    public InterviewPositionsMapper positionsMapper;
    
    /**
     * 添加职位信息
     * 
     * @param dto 职位信息DTO
     * @return 新增的职位ID
     */
    @Override
    @Transactional(rollbackFor = Exception.class)  // 开启事务，任何异常都会回滚
    public Integer addPosition(AddPositionsDto dto) {
        // 1. 创建职位实体对象
        InterviewPositions position = new InterviewPositions();
        
        // 2. 使用链式调用设置职位属性
        position.setPositionName(dto.getPositionName())  // 设置职位名称
                .setDepartment(dto.getDepartment())      // 设置所属部门
                .setPositionLevel(dto.getPositionLevel()) // 设置职位级别
                .setJobDescription(dto.getJobDescription()) // 设置职位描述
                .setJobRequirements(dto.getJobRequirements()) // 设置任职要求
                .setRequiredSkills(dto.getRequiredSkills()) // 设置所需技能
                .setHeadcount(dto.getHeadcount())         // 设置招聘人数
                .setStatus(2); // 设置状态为招聘中(2)
        
        // 3. 调用MyBatis-Plus的save方法保存职位信息到数据库
        save(position);
        
        // 4. 返回新增职位的ID
        return position.getId();
    }

    /**
     * 统一查询职位信息，支持全查、分页查和条件查询
     * 
     * @param queryDto 查询参数DTO
     * @return 查询结果，可能是分页结果或全量列表
     */
    @Override
    public Object queryPositions(PositionQueryDto queryDto) {
        // 1. 创建MyBatis-Plus的Lambda查询条件构造器
        LambdaQueryWrapper<InterviewPositions> queryWrapper = new LambdaQueryWrapper<>();

        // 2. 根据查询参数动态添加查询条件
        if (StringUtils.hasText(queryDto.getPositionName())) {
            // 2.1 如果职位名称不为空，添加模糊查询条件
            queryWrapper.like(InterviewPositions::getPositionName, queryDto.getPositionName());
        }

        if (StringUtils.hasText(queryDto.getDepartment())) {
            // 2.2 如果部门不为空，添加精确匹配条件
            queryWrapper.eq(InterviewPositions::getDepartment, queryDto.getDepartment());
        }

        if (StringUtils.hasText(queryDto.getPositionLevel())) {
            // 2.3 如果职位级别不为空，添加精确匹配条件
            queryWrapper.eq(InterviewPositions::getPositionLevel, queryDto.getPositionLevel());
        }

        if (queryDto.getStatus() != null) {
            // 2.4 如果状态不为空，添加精确匹配条件
            queryWrapper.eq(InterviewPositions::getStatus, queryDto.getStatus());
        }

        // 3. 添加排序条件，按创建时间降序排序
        queryWrapper.orderByDesc(InterviewPositions::getCreatedAt);

        // 4. 根据isPaged参数决定是分页查询还是全量查询
        if (queryDto.getIsPaged() != null && !queryDto.getIsPaged()) {
            // 4.1 全量查询：直接查询所有符合条件的记录
            List<InterviewPositions> positions = list(queryWrapper);
            // 4.2 将实体列表转换为DTO列表并返回
            return convertToResultDtoList(positions);
        } else {
            // 4.3 分页查询：创建分页对象，设置页码和每页大小
            Page<InterviewPositions> page = new Page<>(queryDto.getPageNum(), queryDto.getPageSize());
            // 4.4 执行分页查询
            Page<InterviewPositions> positionPage = page(page, queryWrapper);

            // 4.5 创建分页结果DTO对象
            PositionPageResultDto pageResult = new PositionPageResultDto();
            // 4.6 设置分页信息
            pageResult.setTotal(positionPage.getTotal());         // 设置总记录数
            pageResult.setPageNum((int) positionPage.getCurrent()); // 设置当前页码
            pageResult.setPageSize((int) positionPage.getSize());   // 设置每页大小
            pageResult.setPages((int) positionPage.getPages());     // 设置总页数
            // 4.7 将分页记录转换为DTO列表并设置到结果中
            pageResult.setRecords(convertToResultDtoList(positionPage.getRecords()));

            // 4.8 返回分页结果
            return pageResult;
        }
    }

    /**
     * 将实体列表转换为结果DTO列表
     * 
     * @param positions 职位实体列表
     * @return 职位结果DTO列表
     */
    private List<PositionResultDto> convertToResultDtoList(List<InterviewPositions> positions) {
        // 1. 使用Stream API处理实体列表
        return positions.stream()
                // 2. 将每个实体转换为DTO
                .map(position -> {
                    // 2.1 创建DTO对象
                    PositionResultDto resultDto = new PositionResultDto();
                    // 2.2 使用Spring的BeanUtils工具类复制属性
                    BeanUtils.copyProperties(position, resultDto);
                    // 2.3 返回转换后的DTO
                    return resultDto;
                })
                // 3. 收集为List并返回
                .collect(Collectors.toList());
    }

    /**
     * 修改职位信息
     *
     * @param dto 职位修改参数
     * @return 是否修改成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean updatePosition(UpdatePositionDto dto) {
        // 1. 根据ID查询职位信息
        InterviewPositions position = getById(dto.getId());

        // 2. 如果职位不存在，返回false
        if (position == null) {
            return false;
        }

        // 3. 更新职位信息
        // 3.1 职位名称
        if (StringUtils.hasText(dto.getPositionName())) {
            position.setPositionName(dto.getPositionName());
        }

        // 3.2 所属部门
        if (StringUtils.hasText(dto.getDepartment())) {
            position.setDepartment(dto.getDepartment());
        }

        // 3.3 职位级别
        if (StringUtils.hasText(dto.getPositionLevel())) {
            position.setPositionLevel(dto.getPositionLevel());
        }

        // 3.4 职位描述
        if (StringUtils.hasText(dto.getJobDescription())) {
            position.setJobDescription(dto.getJobDescription());
        }

        // 3.5 任职要求
        if (StringUtils.hasText(dto.getJobRequirements())) {
            position.setJobRequirements(dto.getJobRequirements());
        }

        // 3.6 所需技能
        if (StringUtils.hasText(dto.getRequiredSkills())) {
            position.setRequiredSkills(dto.getRequiredSkills());
        }

        // 3.7 招聘状态
        if (dto.getStatus() != null) {
            position.setStatus(dto.getStatus());
        }

        // 3.8 招聘人数
        if (dto.getHeadcount() != null) {
            position.setHeadcount(dto.getHeadcount());
        }

        // 4. 设置更新时间
        position.setUpdatedAt(LocalDateTime.now());

        // 5. 调用MyBatis-Plus的updateById方法更新职位信息
        return updateById(position);
    }

    /**
     * 删除职位信息
     *
     * @param id 职位ID
     * @return 是否删除成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean deletePosition(Integer id) {
        // 1. 根据ID查询职位信息
        InterviewPositions position = getById(id);
        
        // 2. 如果职位不存在，返回false
        if (position == null) {
            return false;
        }
        
        // 3. 删除职位信息
        return removeById(id);
    }
}
